---
title: SAIF.Business.Policy business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF Claims BOF team
last_reviewed: 2026-08-25
library: SAIF.Business.Policy
reference_type: embedded
---

# SAIF.Business.Policy business rules

This page captures business rules enforced by `SAIF.Business.Policy`. The library itself still exposes no local `AddBusinessRules` registrations, but the documentation set now also includes business rules implemented inside the Oracle packages called by `PolicyInformation`.

## Stored procedure business rules

| Rule ID | Rule | Source | Link |
| --- | --- | --- | --- |
| [BR-POL-002](#br-pol-002-no-qualifying-class-minimum-falls-back-to-default-manual-class-8810) | No qualifying class minimum falls back to default manual class `8810` | `pk73069_rating_procs.get_variable_min_exp_constant` | [Procedure details](procedures/pk73069-rating-procs.md#fallback-to-default-manual-class-8810) |
| [BR-POL-003](#br-pol-003-voluntary-policies-before-april-1-2010-use-a-fixed-500-minimum-premium) | Voluntary policies before `01-apr-2010` use a fixed `500` minimum premium | `pk73069_rating_procs.get_vol_policy_minimum`, `pk73069_rating_procs.get_comb_vol_policy_minimum` | [Procedure details](procedures/pk73069-rating-procs.md#voluntary-policies-before-april-1-2010-use-a-fixed-500-minimum-premium) |
| [BR-POL-004](#br-pol-004-combined-voluntary-minimums-prefer-the-highest-explicit-class-minimum) | Combined voluntary minimums prefer the highest explicit class minimum | `pk73069_rating_procs.get_comb_vol_policy_minimum` | [Procedure details](procedures/pk73069-rating-procs.md#combined-voluntary-minimums-prefer-the-highest-explicit-class-minimum) |
| [BR-POL-005](#br-pol-005-arp-minimums-use-arp-specific-expense-constant-logic) | ARP minimums use ARP-specific expense-constant logic | `pk73069_rating_procs.get_minimum_expense_constant`, `pk73069_rating_procs.sp72759_get_arp_min_ec` | [Procedure details](procedures/pk73069-rating-procs.md#arp-minimums-use-arp-specific-expense-constant-logic) |
| [BR-POL-006](#br-pol-006-submission-ownership-comes-from-the-status-code-ownership-flag) | Submission ownership comes from the status-code ownership flag | `pk73102_policy.does_wcis_own_submission` | [Procedure details](procedures/pk73102-policy.md#submission-ownership-comes-from-the-status-code-ownership-flag) |
| [BR-POL-007](#br-pol-007-missing-or-failed-ownership-lookups-default-to-wcis) | Missing or failed ownership lookups default to WCIS | `pk73102_policy.does_wcis_own_submission` | [Procedure details](procedures/pk73102-policy.md#missing-or-failed-ownership-lookups-default-to-wcis) |
| [BR-POL-008](#br-pol-008-pms-status-is-limited-to-pa-pc-and-pp) | PMS status is limited to `PA`, `PC`, and `PP` | `pk73102_policy.is_pms_status`, `pk73102_policy.is_pms_status_yn` | [Procedure details](procedures/pk73102-policy.md#pms-status-is-limited-to-pa-pc-and-pp) |

## BR-POL-001 Neutral value for non-applicable rate factors

| Field | Value |
| --- | --- |
| **Statement** | An `iAdjustedRateFactor` implementation must return `1` (not `0`) when a given rate factor does not apply to the `iAdjustedRateProvider` passed to it, so the value does not alter a cumulative multiplicative factor.* |
| **Trigger** | Any caller iterating `iAdjustedRateFactor` implementations to compute a cumulative rate adjustment.* |
| **Enforcement** | None in this library — the rule is documented only in a source comment on `CodeMaps\iAdjustedRateFactor.vb`; conformance is left to each implementing class (not present in this library).** |
| **Outcome** | Non-applicable factors are neutral in a multiplicative chain, per the `AdjustedRates.NonApplicableAdjustedRateFactor = 1` constant.* |
| **Source** | `SAIF.Business.Policy\CodeMaps\iAdjustedRateFactor.vb` |

---

## BR-POL-002 No qualifying class minimum falls back to default manual class 8810

| Field | Value |
| --- | --- |
| **Statement** | If `get_variable_min_exp_constant` does not find a qualifying manual-class minimum, it falls back to the default minimum premium from `manual_class_base` where `manual_class_num LIKE '8810%'`. |
| **Trigger** | The procedure finishes scanning the `prem_hist_class_coverage` rows for a premium-history set without assigning `v_min_manual_class_num`. |
| **Enforcement** | The procedure sets `out_default_minimum_flag = 'Y'`, fetches the `8810%` row through `dflt_min_csr`, and assigns that `min_premium` as the return minimum. |
| **Outcome** | Callers receive a default minimum premium even when no class-specific minimum qualifies. |
| **Source** | Oracle retrieval JSON `pk73069_rating_procs.json` — `get_variable_min_exp_constant` |

---

## BR-POL-003 Voluntary policies before April 1 2010 use a fixed 500 minimum premium

| Field | Value |
| --- | --- |
| **Statement** | Voluntary policies effective before `01-apr-2010` return the fixed minimum premium constant `500`. |
| **Trigger** | `get_vol_policy_minimum` or `get_comb_vol_policy_minimum` receives an effective date earlier than `c_vol_variable_min_eff_date`. |
| **Enforcement** | The package bypasses variable-minimum evaluation and assigns `c_vol_fixed_min_amount`. |
| **Outcome** | Older voluntary policies always return `500` as the annual minimum premium. |
| **Source** | Oracle retrieval JSON `pk73069_rating_procs.json` — `get_vol_policy_minimum`, `get_comb_vol_policy_minimum` |

---

## BR-POL-004 Combined voluntary minimums prefer the highest explicit class minimum

| Field | Value |
| --- | --- |
| **Statement** | For combined voluntary policies using variable minimum logic, the package returns the highest non-default minimum across related premium-history sets; if no explicit class minimum exists, it returns the highest default minimum. |
| **Trigger** | `get_comb_vol_policy_minimum` iterates the premium-history sets for a combination effective on or after `01-apr-2010`. |
| **Enforcement** | The procedure tracks explicit minimums in `v_max_minimum`, default minimums in `v_default_minimum`, and returns `NVL(v_max_minimum, v_default_minimum)`. |
| **Outcome** | Combination policies prefer a real class-specific minimum whenever one is available. |
| **Source** | Oracle retrieval JSON `pk73069_rating_procs.json` — `get_comb_vol_policy_minimum` |

---

## BR-POL-005 ARP minimums use ARP-specific expense constant logic

| Field | Value |
| --- | --- |
| **Statement** | Non-voluntary policies are processed through ARP minimum logic, and ARP expense constants are selected from the rate file effective on the applicable ARP rate date. |
| **Trigger** | `get_minimum_expense_constant` receives policy context whose `market_type_code` is not `VOL`, or `get_variable_min_exp_constant` is evaluating an `ARP` request. |
| **Enforcement** | The package calls `sp72759_get_arp_min_ec`, optionally switches to `nr_rate_file_seq_num` when `new_outstanding_code = 'O'`, then reads `assigned_risk_expense_constant` for the rate-file effective date. |
| **Outcome** | ARP requests return minimum-premium and expense-constant results from ARP rate data instead of voluntary-policy logic. |
| **Source** | Oracle retrieval JSON `pk73069_rating_procs.json` — `get_minimum_expense_constant`, `get_variable_min_exp_constant`, `sp72759_get_arp_min_ec` |

---

## BR-POL-006 Submission ownership comes from the status code ownership flag

| Field | Value |
| --- | --- |
| **Statement** | `does_wcis_own_submission` determines ownership by returning `submission_status_code.wcis_owns_flag` for the current status of the matching submission. |
| **Trigger** | The function receives a policy number that resolves to a `sub_policy` row. |
| **Enforcement** | It joins `sub_policy` to `submission_status_code` on the submission status code and returns the retrieved `wcis_owns_flag`. |
| **Outcome** | Calling code receives the status-driven WCIS ownership indicator for that submission. |
| **Source** | Oracle retrieval JSON `pk73102_policy.json` — `does_wcis_own_submission` |

---

## BR-POL-007 Missing or failed ownership lookups default to WCIS

| Field | Value |
| --- | --- |
| **Statement** | When the ownership lookup finds no matching submission or raises any unexpected exception, `does_wcis_own_submission` returns `'Y'`. |
| **Trigger** | The function hits `NO_DATA_FOUND` or `WHEN OTHERS`. |
| **Enforcement** | Both exception handlers explicitly `RETURN 'Y'`. |
| **Outcome** | The .NET caller maps the response to `Enums.PolicyOwnershipSystems.WCIS` rather than treating the lookup as a failure. |
| **Source** | Oracle retrieval JSON `pk73102_policy.json` — `does_wcis_own_submission`, `SAIF.Business.Policy\PolicyInformation.vb` |

---

## BR-POL-008 PMS status is limited to PA PC and PP

| Field | Value |
| --- | --- |
| **Statement** | Only policy status codes `PP`, `PA`, and `PC` are treated as PMS statuses, and the Y/N wrapper returns `Y` only for those codes. |
| **Trigger** | `is_pms_status` or `is_pms_status_yn` evaluates a policy status code. |
| **Enforcement** | `is_pms_status` checks membership in `('PP', 'PA', 'PC')`; `is_pms_status_yn` converts the Boolean result into `'Y'` or `'N'`. |
| **Outcome** | PMS-aware callers receive a consistent Boolean or Y/N result from the same status-code rule. |
| **Source** | Oracle retrieval JSON `pk73102_policy.json` — `is_pms_status`, `is_pms_status_yn` |

---

## Inherited business rules

Rules in this section originate from base classes provided by dependency framework libraries. They are enforced by inherited behavior, not by code in this library. The originating class and library are recorded in each rule's **Origin** field.

## INH-POL-001 Registered business rules are checked and broken rules tracked

| Field | Value |
| --- | --- |
| **Statement** | Each `clsBusinessBase`-derived object owns a `clsRulesManager`; calling code invokes `Rules.CheckRules("RuleName")` to run registered rule handlers, and any rule that fails is recorded in the object's broken-rule collection.† |
| **Trigger** | A `clsBusinessBase`-derived object (`clsHazardGroup`) invokes rule checking during its lifecycle (e.g., validation before save).† |
| **Enforcement** | Framework-provided `clsRulesManager` mechanism in `SAIF.Framework.Core`; surfaced to data-binding consumers via `IDataErrorInfo.Error`/`Item`.† |
| **Outcome** | Broken rules are tracked and exposed for UI validation; `clsHazardGroup`'s own `#Region " BUSINESS RULES"` block is empty (placeholder comment only), so no domain-specific rules are currently registered through this mechanism in this library.* |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessBase` |
| **Source** | Retrieved from indexed documentation via Legends CLI |

---

## Notes
- No local `AddBusinessRules`/`Rules` registrations exist in `clsHazardGroup`/`clsHazardGroupCollection`; the new `BR-POL-002` through `BR-POL-008` rules are enforced inside Oracle packages called by `PolicyInformation`.
- Mark inferred statements with `*` and unknown statements with `**`. Do not use bold inline confidence labels.
- Statements marked with `†` were retrieved from dependency library documentation via the Legends CLI RAG service.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [API reference](api/index.md)

> **Note:** Statements marked with `*` were inferred from code structure, naming
> conventions, or contextual evidence where direct confirmation was not available
> in source artifacts. Statements marked with `**` could not be confirmed; treat
> as unknown until verified. Statements marked with `†` are derived from dependency
> library documentation via the Legends CLI. They describe inherited behavior from
> the indicated origin library and should be verified if the dependency version changes.

## Sources
- `SAIF.Business.Policy\CodeMaps\iAdjustedRateFactor.vb`
- `SAIF.Business.Policy\clsHazardGroup.vb`
- `SAIF.Business.Policy\clsHazardGroupCollection.vb`
- `SAIF.Business.Policy\PolicyInformation.vb`
- Oracle retrieval JSON: `C:\Users\chrfre\AppData\Local\Temp\oracle-sources\pk73069_rating_procs.json`
- Oracle retrieval JSON: `C:\Users\chrfre\AppData\Local\Temp\oracle-sources\pk73102_policy.json`
